package com.lihaozhe.restclient.service;

import com.lihaozhe.restclient.config.ApiConfig;
import com.lihaozhe.restclient.dto.ProductDTO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClient;

import java.util.Arrays;
import java.util.List;

/**
 * 商品服务类
 * 使用RestClient调用其他微服务的商品API
 * 模拟电商系统中的商品信息获取
 *
 * @author 李昊哲
 * @version 1.0.0
 */
@Service
public class ProductService {
  // 创建RestClient实例，用于发送HTTP请求
  private final RestClient restClient;
  private final ApiConfig apiConfig;
  private final Logger logger = LoggerFactory.getLogger(ProductService.class);
  private final String baseUrl;


  /**
   * 构造函数，初始化RestClient
   */
  public ProductService(RestClient restClient, ApiConfig apiConfig) {
    this.restClient = restClient;
    this.apiConfig = apiConfig;
    this.baseUrl = String.format("%s/api/products", apiConfig.getUrl());
  }

  /**
   * 根据商品ID获取商品信息
   * 模拟调用商品服务的API
   *
   * @param productId 商品ID
   * @return 商品信息
   */
  public ProductDTO getProductById(Long productId) {
    // 构建商品服务URL（实际项目中应该是配置的服务地址）
    String productServiceUrl = String.format("%s/%d", baseUrl, productId);
    try {
      // 使用RestClient发送GET请求获取商品信息
      return restClient.get()
          .uri(productServiceUrl)   // 设置请求URL
          .accept(MediaType.APPLICATION_JSON)
          .retrieve()               // 执行请求并获取响应
          .body(ProductDTO.class);  // 将响应体转换为ProductDTO对象
    } catch (Exception e) {
      // 处理服务调用异常，返回默认商品
      logger.error("调用商品服务失败: {}", e.getMessage());
      return new ProductDTO(productId, "默认商品", 0.0, 0);
    }
  }

  /**
   * 获取所有商品列表
   * 模拟调用商品服务的列表API
   *
   * @return 商品列表
   */
  public List<ProductDTO> getAllProducts() {
    try {
      // 使用RestClient发送GET请求获取商品信息
      ProductDTO[] products = restClient.get()
          .uri(baseUrl)   // 设置请求URL
          .accept(MediaType.APPLICATION_JSON)
          .retrieve()               // 执行请求并获取响应
          .body(ProductDTO[].class);// 将响应体转换为ProductDTO对

      if (products != null) {
        return Arrays.asList(products);
      }else  {
        return List.of();
      }
    }catch (Exception e) {
      // 处理服务调用异常，返回空列表
      logger.error("获取商品列表失败: {}", e.getMessage());
      return List.of();
    }
  }

  /**
   * 更新商品库存
   * 模拟调用商品服务的库存更新API
   *
   * @param productId 商品ID
   * @param quantity  库存变化数量（正数增加，负数减少）
   * @return 更新是否成功
   */
  public boolean updateProductStock(Long productId, Integer quantity) {
    String stockUpdateUrl = String.format("%s/%d/stock", baseUrl, productId);

    try {
      // 构建请求体（简单的数量参数）
      String requestBody = String.format("{\"quantity\": %d}", quantity);

      // 发送PUT请求更新库存
      String response = restClient.put()
          .uri(stockUpdateUrl)
          .header("Content-Type", "application/json") // 设置请求头
          .accept(MediaType.APPLICATION_JSON)
          .body(requestBody)                          // 设置请求体
          .retrieve()
          .body(String.class);                        // 获取字符串响应

      return "success".equals(response);
    } catch (Exception e) {
      logger.error("更新商品库存失败: {}", e.getMessage());
      return false;
    }
  }
}
